/** 文件系统的文件管理
 * @file
 * @author
 * @date
 * @brief
 */
#define INCLUDE_LFS_UI_IMG_FILE_NAME_TAB
#include "lfs_file_manager.h"
#include "display_ctrl.h"
#include <string.h>
#include "device_type.h"
#include "localize.h"
uint8_t const *const config_files[] = {
    DEVICE_TYPE_FILE_PATH,
    DEVICE_NAME_FILE_PATH,
    LOCALIZE_CODE_PATH,
};
#define CONFIG_FILES_COUNT (sizeof(config_files) / sizeof(config_files[0]))
const char *FILE_UNFIND = "file not found";
/*********************************************************************************************
 * @brief 获取第N个界面的第N个
 * @param [in] param1
 * @warning
 ********************************************************************************************/
const char *lfs_file_get_name(int file_sn)
{
    if (file_sn < sizeof(LFS_UI_IMG_FILE_NAME_TAB) / FILE_NAME_SIZE)
    {
        return (const char *)LFS_UI_IMG_FILE_NAME_TAB[file_sn];
    }
    // file_sn -= sizeof(LFS_UI_IMG_FILE_NAME_TAB) / FILE_NAME_SIZE;
    // if (file_sn < CONFIG_FILES_COUNT)
    // {
    //     return (const char *)LFS_USER_IMG_FILE_NAME_TAB[file_sn];
    // }
    // else
    {
        return FILE_UNFIND;
    }
}

//标记文件是否已存在1bit
#pragma diag_suppress=1278
static uint8_t file_ui_ready_flag[(sizeof(LFS_UI_IMG_FILE_NAME_TAB) / FILE_NAME_SIZE + 7) / 8] = {0};
#pragma diag_warning=1278
// static uint8_t file_user_ready_flag[(sizeof(LFS_USER_IMG_FILE_NAME_TAB) / FILE_NAME_SIZE + 7) / 8] = {0};
/*********************************************************************************************
 * @brief 标记已获取的文件
 * @param [in] 文件名称 ready_flag = 1标记已有，0=标记删除
 * @warning
 ********************************************************************************************/
void lfs_file_set_ready_flag(char *file_name, uint8_t ready_flag)
{
    int index;
    //遍历查找文件
    for (index = 0; index < sizeof(LFS_UI_IMG_FILE_NAME_TAB) / FILE_NAME_SIZE; index++)
    {
        if (memcmp(file_name, LFS_UI_IMG_FILE_NAME_TAB[index], FILE_NAME_SIZE) == 0)
        {
            break;
        }
    }
    //找到文件，处理标记
    if (index < sizeof(LFS_UI_IMG_FILE_NAME_TAB) / FILE_NAME_SIZE)
    {
        if (ready_flag)
        {
            file_ui_ready_flag[index / 8] |= 1 << (index % 8);
        }
        else
        {
            file_ui_ready_flag[index / 8] &= ~(1 << (index % 8));
        }
        return;
    }

    // //继续看自定义的列表
    // //遍历查找文件
    // for (index = 0; index < sizeof(LFS_USER_IMG_FILE_NAME_TAB) / FILE_NAME_SIZE; index++)
    // {
    //     if (memcmp(file_name, LFS_USER_IMG_FILE_NAME_TAB[index], FILE_NAME_SIZE) == 0)
    //     {
    //         break;
    //     }
    // }
    // //找到文件，处理标记
    // if (index < sizeof(LFS_USER_IMG_FILE_NAME_TAB) / FILE_NAME_SIZE)
    // {
    //     if (ready_flag)
    //     {
    //         file_user_ready_flag[index / 8] |= 1 << (index % 8);
    //     }
    //     else
    //     {
    //         file_user_ready_flag[index / 8] &= ~(1 << (index % 8));
    //     }
    //     return;
    // }
}

/*********************************************************************************************
 * @brief 获取还缺少的ui文件个数
 * @param [in] 文件名称
 * @warning
 ********************************************************************************************/
int lfs_file_get_ui_unready_count(void)
{
    int unready_count = 0;
    int offset = 1;
    uint8_t *p_flag = file_ui_ready_flag;
    for (int i = 0; i < sizeof(LFS_UI_IMG_FILE_NAME_TAB) / FILE_NAME_SIZE; i++)
    {
        if ((*p_flag & offset) == 0)
        {
            unready_count++;
        }
        if ((i % 8) == 7)
        {
            p_flag++;
            offset = 1;
        }
        else
        {
            offset <<= 1;
        }
    }
    return unready_count;
}
/*********************************************************************************************
 * @brief 查询缺少的ui文件名称
 * @param [in] index 第index个缺少的文件名称
 * @warning 例如缺少1,3,5文件。index=0返回文件1名称，index=1返回文件3名称
 ********************************************************************************************/
const char *lfs_file_get_ui_unready_name(int index)
{
    uint8_t offset = 1;
    uint8_t *p_flag = file_ui_ready_flag;
    for (int i = 0; i < sizeof(LFS_UI_IMG_FILE_NAME_TAB) / FILE_NAME_SIZE; i++)
    {
        if ((*p_flag & offset) == 0) //找到缺少的文件
        {
            if (index == 0)
            {
                return (const char *)LFS_UI_IMG_FILE_NAME_TAB[i];
            }
            else
            {
                index--;
            }
        }
        if ((i % 8) == 7)
        {
            p_flag++;
            offset = 1;
        }
        else
        {
            offset <<= 1;
        }
    }

    //循环结束则未找到符合的文件名称。不缺少文件或index偏大
    return FILE_UNFIND;
}

// /*********************************************************************************************
//  * @brief 查询是否是列表内需要的文件
//  * @param [in] param1
//  * @return ret 1=在列表内  0=不在
//  * @warning
//  ********************************************************************************************/
// uint8_t lfs_file_if_in_tab(char *p_file_name)
// {
//     //是否是UI界面需要的文件
//     for (int i = 0; i < sizeof(LFS_UI_IMG_FILE_NAME_TAB) / FILE_NAME_SIZE; i++)
//     {
//         if (memcmp(p_file_name, LFS_UI_IMG_FILE_NAME_TAB[i], FILE_NAME_SIZE) == 0)
//         {
//             return 1;
//         }
//     }
//     //是否是用户自定义的文件
//     // for (int i = 0; i < sizeof(LFS_USER_IMG_FILE_NAME_TAB) / FILE_NAME_SIZE; i++)
//     // {
//     //     if (memcmp(p_file_name, LFS_USER_IMG_FILE_NAME_TAB[i], FILE_NAME_SIZE) == 0)
//     //     {
//     //         return 1;
//     //     }
//     // }
//     return 0;
// }
/*********************************************************************************************
 * @brief 是否是自定义的文件
 * @param [in] param1
 * @return ret 1=在ui列表内，0=不在
 * @warning
 ********************************************************************************************/
uint8_t lfs_file_if_in_user_tab(char *p_file_name)
{
    //是否是用户自定义的文件
    for (int i = 0; i < CONFIG_FILES_COUNT; i++)
    {
        if (strcmp(p_file_name, (char const *)config_files[i]) == 0)
        {
            return 1;
        }
    }
    return 0;
}

/*********************************************************************************************
 * @brief 是否是UI文件
 * @param [in] param1
 * @return ret 1=在ui列表内，0=不在
 * @warning
 ********************************************************************************************/
uint8_t lfs_file_if_in_ui_tab(char *p_file_name)
{
    //是否是UI界面需要的文件
    for (int i = 0; i < sizeof(LFS_UI_IMG_FILE_NAME_TAB) / FILE_NAME_SIZE; i++)
    {
        if (memcmp(p_file_name, LFS_UI_IMG_FILE_NAME_TAB[i], FILE_NAME_SIZE) == 0)
        {
            return 1;
        }
    }
    return 0;
}

/*********************************************************************************************
 * @brief 获取UI文件的校验码
 * @param [in] param1
 * @return ret 格式：首字节<<24 | 末字节<<16 | 累加和2字节
 * @warning 如果非UI文件会返回0
 ********************************************************************************************/
uint32_t lfs_file_get_ui_file_check_num(char *p_file_name)
{
    // UI文件
    for (int i = 0; i < sizeof(LFS_UI_IMG_FILE_NAME_TAB) / FILE_NAME_SIZE; i++)
    {
        if (memcmp(p_file_name, LFS_UI_IMG_FILE_NAME_TAB[i], FILE_NAME_SIZE) == 0)
        {
            return LFS_UI_IMG_FILE_CHECK_NUM[i];
        }
    }
    return 0;
}
